Kyuubi: 网易数帆开源的企业级数据湖探索平台(架构篇)
Kyuubi是网易数帆旗下易数大数据团队开源的一个企业级数据湖探索平台,建立在Apache Spark之上。Kyuubi提供一个高性能的通用JDBC和SQL执行引擎,通过它,用户能够像处理普通数据一样处理大数据。本文将详细解读Kyuubi的架构设计。
引言
开源大数据项目的繁荣带来了强大的大数据平台,而对于负责数据价值挖掘的终端用户而言,平台的技术门槛是另一种挑战。如果能将平台的能力统合,并不断地优化和迭代,让用户能够通过JDBC和SQL这种最普遍最通用的技术来使用,数据生产力将可以得到进一步的提升。
Kyuubi就是在此背景下诞生的一个企业级数据湖平台,它能够作为一个高性能的通用JDBC和SQL执行引擎,通过SQL进行数据湖数据探索,促进用户像处理普通数据一样处理大数据。
Kyuubi提供了一个标准化的JDBC接口,在大数据场景下可以方便地进行数据访问。终端用户可以专注于开发自己的业务系统和挖掘数据价值,而无需了解底层的大数据平台(计算引擎、存储服务、元数据管理等)。
Kyuubi依赖Apache Spark提供高性能的数据查询能力,引擎能力的每一次提升,都能帮助Kyuubi的性能实现质的飞跃。此外,Kyuubi通过引擎缓存提升了ad-hoc响应能力,并通过横向扩展和负载均衡提升了并发能力。
Kyuubi提供完整的认证和授权服务,确保数据和元数据的安全。
Kyuubi提供强大的高可用性和负载均衡,以保证SLA的承诺。
Kyuubi提供两级弹性资源管理架构,有效提高资源利用率,同时覆盖所有场景的性能和响应需求,包括交互式,或批处理和点查询,或全表扫描。
Kyuubi拥抱Spark,并在Spark之上构建了一个生态系统,这它使得能够快速扩展现有的生态系统,并引入新的特性,例如云原生支持和Data Lake/Lake House
支持。
Kyuubi的愿景是建立在Apache Spark和Data Lake技术之上,统一门户,成为一个理想的数据湖管理平台。它可以以纯SQL的方式支持数据处理(如ETL)和分析(如BI)。所有的工作负载都可以在同一个平台上完成,使用一份数据,一个SQL接口。
架构概述
Kyuubi系统的基本技术架构如下图所示。
图的中间部分是Kyuubi服务端的主要部分,它处理来自图像左边所示的客户端的连接和执行请求。在Kyuubi中,这些连接请求被维护为Kyuubi Session
,执行请求被维护为Kyuubi Operation
,并与相应的session进行绑定。
Kyuubi Session
的创建可以分为两种情况:轻量级和重量级。大多数session的创建都是轻量级的,用户无感知。唯一重量级的情况是在用户的共享域中没有实例化或缓存SparkContext
,这种情况通常发生在用户第一次连接或长时间没有连接的时候。这种一次性成本的session维护模式可以满足大部分的ad-hoc快速响应需求。
Kyuubi以松耦合的方式维护与SparkConext
的连接。这些SparkContexts
可以是本服务实例在客户端部署模式下在本地创建的Spark程序,也可以是集群部署模式下在Yarn或Kubernetes集群中创建的。在高可用模式下,这些SparkConext
也可以由其他机器上的Kyuubi实例创建,然后由这个实例共享。
这些SparkConext
实例本质上是由Kyuubi服务托管的远程查询执行引擎程序。这些程序在Spark SQL上实现,并对SQL语句进行端到端编译、优化和执行,以及与元数据(如Hive Metastore)和存储(如HDFS)服务进行必要的交互,最大限度地发挥Spark SQL的威力。它们可以自行管理自己的生命周期,自行缓存和回收,并且不受Kyuubi服务器上故障转移的影响。
接下来,我们来分享一下Kyuubi的一些关键设计理念。
统一接口
Kyuubi实现了Hive Service RPC模块,它提供了与HiveServer2和Spark Thrift Server相同的数据访问方式。在客户端,您可以构建奇妙的业务报表、BI应用,甚至ETL工作,只通过Hive JDBC模块。
您只需要熟悉结构化查询语言(SQL)和Java数据库连接(JDBC)就可以处理海量数据。它可以帮助您专注于业务系统的设计和实现。
SQL是访问关系型数据库的标准语言,在大数据生态中也非常流行。
JDBC为工具/数据库开发者提供了一个标准的API,使得使用纯Java API编写数据库应用成为可能。
目前有很多免费或商业的JDBC工具。
运行时资源弹性
Kyuubi和Spark Thrift Server(STS)最大的区别在于,STS是一个单一的Spark应用。例如,如果一个应用运行在Apache Hadoop Yarn集群上,这个应用也是一个单一的Yarn应用,创建后只能存在于Yarn集群的特定固定队列中。Kyuubi支持提交多个Spark应用。
对于资源管理,Yarn失去了资源管理器的角色,没有起到相应的资源隔离和共享的作用。当来自客户端的用户拥有不同的资源队列权限时,这种情况下STS将无法处理。
对于数据访问,单个Spark应用在全球范围内只有一个用户,也就是sparkUser
,我们必须赋予它一个类似超级用户的角色,才能让它对不同的客户端用户进行数据访问,这在生产环境中是一种极不安全的做法。
Kyuubi会根据客户端的连接请求创建不同的Spark应用,这些应用可以放在不同的共享域中,供其他连接请求共享。
Kyuubi在启动过程中不会占用集群管理器(如Yarn)的任何资源,如果没有任何活跃的session与SparkContext
交互,Kyuubi会将所有资源返还。
Spark还提供了动态资源分配,根据工作负载动态调整应用程序占用的资源。这意味着应用可以将不再使用的资源还给集群,当有需求时再次请求。如果多个应用程序在您的Spark集群中共享资源,这个特性特别有用。
通过这些特性,Kyuubi提供了一个两级弹性资源管理架构,以有效提高资源利用率。
比如说,
./beeline - u 'jdbc:hive2://kyuubi.org:10009/; \
hive.server2.proxy.user=tom# \
spark.yarn.queue=thequeue; \
spark.dynamicAllocation.enabled=true \
spark.dynamicAllocation.maxExecutors=500 \
spark.shuffle.service.enabled=true \
spark.executor.cores=3; \
spark.executor.memory=10g'
如果名为tom
的用户打开了像上面这样的连接,Kyuubi将尝试在Yarn集群中名为thequeue
的队列中创建一个拥有[3,500]个执行器(3核,每个10g mem)的Spark SQL引擎应用程序。
一方面,由于tom启用了Spark的动态资源请求特性,Spark会根据SQL操作的规模和队列中的可用资源,高效地请求和回收程序内的执行器。另一方面,当Kyuubi发现程序闲置时间过长时,也会对程序本身进行回收。
高可用性与负载均衡
对于企业服务来说,服务水平协议(SLA)的承诺必须达到很高的水平。而并发量也需要足够强大,以支持整个企业的请求。Spark Thrift Server作为单一的Spark应用,在没有实现High Availability的情况下,很难满足SLA和并发的要求。当有大的查询请求时,在元数据服务访问、Spark Driver的调度和内存压力,或者是应用的整体计算资源限制等方面都有潜在的瓶颈。
Kyuubi基于ZooKeeper同时提供了高可用和负载均衡解决方案,如下图所示。
我们从上到下进行分解。
图中最上面的是客户端层,客户端可以从服务发现层的命名空间中找到多个注册的Kyuubi实例(k.i.),然后选择一个连接。注册到同一命名空间的Kyuubi实例相互提供了负载均衡的能力。
被选中的Kyuubi实例将从服务发现层的eng-namespace中选择一个可用的引擎实例(e.i.)建立连接。如果没有找到可用的实例,它将创建一个新的实例,等待引擎完成注册,然后继续连接。
如果是同一个人请求新的连接,则会将连接设置为同一个或另一个Kyuubi实例,但引擎实例会被重复使用。
对于来自不同用户的连接,将重复步骤2和3。这是因为在服务发现层中,用于存储引擎实例地址的命名空间是基于用户隔离的(默认情况下),不同用户不能跨命名空间访问其他实例。
认证与授权
在一个安全的集群中,服务应该能够识别和认证呼叫者。由于用户声称的事实并不意味着这一定是真的。Kyuubi的认证过程用于验证客户端用来与Kyuubi服务器对话的用户身份。一旦完成,如果成功,客户端和服务器之间将建立一个可信的连接;否则拒绝。
经过验证的客户端用户也将是创建关联引擎实例的用户,然后可以应用数据库对象或存储的授权。我们还创建了一个Submarine: Spark Security作为外部插件,实现基于SQL标准的细粒度授权。
结论
Kyuubi是一个统一的多租户JDBC接口,用于大规模数据处理和分析,建立在Apache Spark™之上。它扩展了Spark Thrift Server在企业应用中的场景,其中最重要的是多租户支持。
除了网易集团业务,目前已有网约车、餐饮零售、物流等领域多家企业在其大数据技术栈中采用了Kyuubi。欢迎大家加入到Kyuubi项目,共促大数据价值最大化!
项目开源地址:https://github.com/netease/kyuubi
作者简介: 燕青,网易数帆-易数事业部高级工程师,主要专注于开源大数据领域,是Apache Spark贡献者,主要贡献于SQL/Core模块。他也是Kyuubi项目和spark-authorizer项目的发起人,后者通过Apache Ranger解决Apache Spark的安全问题。他也是Apache Submarine Committer,致力于改进Submarine项目作为机器学习平台。
相关阅读: